Description
有 $n$ 个排成一行的弹力装置。第 $i$ 个弹力装置的弹力系数是 $k_i$,它会把绵羊弹到第 $i+k_i$ 个装置上。如果不存在第 $i+k_i$ 个装置,绵羊被弹飞。
$m$ 次询问,有两种操作:$opt=1$: 输入一个数 $i$,查询绵羊从第 $i$ 个装置开始需要多少次被弹飞;$opt=2$: 输入两个数 $i$ 和 $j$,表示将装置 $i$ 的弹力系数改为 $j$。
数据范围:$n<=200000, m<=100000$
Solution
对 $n$ 个数进行分块。维护每个点 弹出所在块需要的次数 和 弹出后落在哪个节点上。从后往前扫描,方便每个节点继承后面节点的值。
预处理出所有点维护的信息,复杂度为 $O(n)$。修改 $i$ 节点的值时,不难发现与其有关的是当前块内编号比 $i$ 小的所有节点。修改这些节点维护的值。
最终复杂度为 $O(mlog_n)$。
Code
1 |
|